// 认证相关工具函数

/**
 * 检查用户是否已登录
 * @param {Object} store - Vuex store实例
 * @returns {boolean}
 */
export function isLoggedIn(store) {
  return store.getters['user/isLoggedIn']
}

/**
 * 获取用户token
 * @param {Object} store - Vuex store实例
 * @returns {string|null}
 */
export function getToken(store) {
  return store.getters['user/getToken']
}

/**
 * 获取用户信息
 * @param {Object} store - Vuex store实例
 * @returns {Object|null}
 */
export function getUserInfo(store) {
  return store.getters['user/getUserInfo']
}

/**
 * 检查用户是否有特定权限
 * @param {Object} store - Vuex store实例
 * @param {string|Array} permissions - 权限名称或权限数组
 * @returns {boolean}
 */
export function hasPermission(store, permissions) {
  const userPermissions = store.getters['user/getUserPermissions']

  if (Array.isArray(permissions)) {
    return permissions.some(permission => userPermissions.includes(permission))
  }

  return userPermissions.includes(permissions)
}

/**
 * 检查用户是否有所有指定权限
 * @param {Object} store - Vuex store实例
 * @param {Array} permissions - 权限数组
 * @returns {boolean}
 */
export function hasAllPermissions(store, permissions) {
  const userPermissions = store.getters['user/getUserPermissions']
  return permissions.every(permission => userPermissions.includes(permission))
}

/**
 * 登录函数
 * @param {Object} store - Vuex store实例
 * @param {Object} loginData - 登录数据
 * @returns {Promise}
 */
export function login(store, loginData) {
  return store.dispatch('user/login', loginData)
}

/**
 * 登出函数
 * @param {Object} store - Vuex store实例
 * @returns {Promise}
 */
export function logout(store) {
  return store.dispatch('user/logout')
}

/**
 * 刷新用户信息
 * @param {Object} store - Vuex store实例
 * @returns {Promise}
 */
export function refreshUserInfo(store) {
  return store.dispatch('user/fetchUserInfo')
}

/**
 * 更新用户信息
 * @param {Object} store - Vuex store实例
 * @param {Object} userInfo - 用户信息
 * @returns {Promise}
 */
export function updateUserInfo(store, userInfo) {
  return store.dispatch('user/updateUserInfo', userInfo)
}

/**
 * 刷新token
 * @param {Object} store - Vuex store实例
 * @returns {Promise}
 */
export function refreshToken(store) {
  return store.dispatch('user/refreshToken')
}

/**
 * 检查token是否有效（简单检查）
 * @param {Object} store - Vuex store实例
 * @returns {boolean}
 */
export function isTokenValid(store) {
  const token = getToken(store)
  if (!token) return false

  // 这里可以添加更复杂的token验证逻辑
  // 比如检查token是否过期等
  return true
}

/**
 * 初始化用户状态（用于应用启动时）
 * @param {Object} store - Vuex store实例
 * @returns {Promise}
 */
export async function initUserState(store) {
  if (isLoggedIn(store) && !getUserInfo(store)) {
    try {
      await refreshUserInfo(store)
      return true
    } catch (error) {
      console.error('初始化用户状态失败:', error)
      // 如果获取用户信息失败，清除登录状态
      logout(store)
      return false
    }
  }
  return true
}

/**
 * 创建路由守卫函数
 * 在需要认证的路由中确保用户信息已加载
 * @param {Object} store - Vuex store实例
 * @returns {Function} - 路由守卫函数
 */
export function createAuthGuard(store) {
  return async (to, from, next) => {
    const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
    const requiresUserInfo = to.matched.some(
      record => record.meta.requiresUserInfo
    )
    const requiredPermissions = to.meta.permissions || []

    // 如果不需要认证，直接放行
    if (!requiresAuth) {
      next()
      return
    }

    // 检查用户是否已登录
    const isLoggedIn = store.getters['user/isLoggedIn']
    const userInfo = store.getters['user/getUserInfo']

    // 需要登录但未登录，重定向到登录页
    if (!isLoggedIn) {
      next({
        path: '/login',
        query: { redirect: to.fullPath },
      })
      return
    }

    // 需要用户信息但用户信息为空，先获取用户信息
    if (requiresUserInfo && !userInfo) {
      try {
        await store.dispatch('user/fetchUserInfo')
      } catch (error) {
        console.error('获取用户信息失败:', error)
        // 如果获取用户信息失败，清除登录状态并重定向到登录页
        store.dispatch('user/logout')
        next({
          path: '/login',
          query: { redirect: to.fullPath, error: 'auth_failed' },
        })
        return
      }
    }

    // 检查权限
    if (requiredPermissions.length > 0) {
      const userPermissions = store.getters['user/getUserPermissions']
      const hasAllRequiredPermissions = requiredPermissions.every(permission =>
        userPermissions.includes(permission)
      )

      if (!hasAllRequiredPermissions) {
        // 权限不足
        next('/403') // 无权限页面
        return
      }
    }

    // 所有检查通过，放行
    next()
  }
}

export default {
  isLoggedIn,
  getToken,
  getUserInfo,
  hasPermission,
  hasAllPermissions,
  login,
  logout,
  refreshUserInfo,
  updateUserInfo,
  refreshToken,
  isTokenValid,
  initUserState,
  createAuthGuard,
}
